<?
header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ERROR|E_WARNING|E_PARSE);

//####################################################################### Initialization
define('InStern', true);
define('timedebug',true); //debug code to investigate problems
session_start();




//####################################################################### Validate session
if(timedebug) $timelog.=microtime(true).": Start processing\n";

if(!$_SESSION[login] OR ($_SESSION[server][Id]==0 AND $_GET[server]==0)){
	//Session is not valid, redirect user to the main page
	header( 'Location: index.php' );
    exit;
}
if(timedebug) $timelog.=microtime(true).": Loading Configuration\n";
include("conf/main.conf.php");
include("conf/server.conf.php");
require("conf/debug.conf.php");
require("conf/fraktionen.conf.php");
require("conf/build.conf.php");
require("conf/forsch.conf.php");
require("conf/schiffe.conf.php");
require("conf/ress.conf.php");
include("lang/".$_SESSION[lang]."/game.lang.php");
include("lang/".$_SESSION[lang]."/configuration.lang.php");




//####################################################################### Loading Classes
if(timedebug) $timelog.=microtime(true).": Loading Classes\n";
include("class/mysql.class.php");
include("class/website.class.php");




//####################################################################### Loading functions
if(timedebug) $timelog.=microtime(true).": Loading Funktions\n";
require("funk/alle.php");
require("funk/game/allyIgm.funk.php");
require("funk/game/bewohner.funk.php");
require("funk/game/calcKosten.funk.php");
require("funk/game/calcLevel.funk.php");
require("funk/game/calcRess.funk.php");
require("funk/game/calcZeit.funk.php");
require("funk/game/flottenpunkte.funk.php");
require("funk/game/flugaktion.funk.php");
require("funk/game/getfraktion.funk.php");
require("funk/game/igm.funk.php");
require("funk/game/loadAlly.funk.php");
require("funk/game/loadplanet.funk.php");
require("funk/game/vorkommen.funk.php");


if(timedebug) $timelog.=microtime(true).": Establish Database connection\n";

// Establish connection to game database server
$db = new database($config_db_hostname, $config_db_uname, $config_db_upass);
$db->selectDB($config_db_name);
if ($_GET[server]>0){
    $db->query("UPDATE spieler SET IP='".$_SERVER[REMOTE_ADDR]."' WHERE User=".intval($_SESSION[user][Id]).";");
}


//####################################################################### Loading Server
if($_GET[server]>0){
    if(timedebug) $timelog.=microtime(true).": Loading Server configuration (once)\n";
	$db->query("SELECT * FROM `server` WHERE Start < " . date("U") . " AND Id=".intval($_GET[server]).";");
	$row = $db->fetch_assoc();
	if (!is_array($row)){
		show_error($error_msg[server_not_found],"index.php");
		exit;
	}
	$_SESSION[server]=$row;
    // Reset page
    $_SESSION[page] = "";
}

//####################################################################### Loading Server configurations
foreach($_SESSION[server] AS $key=>$value){
  if(!isset($config[$key])){
        $config[$key]=$value;
    }else{
        show_error("Configparameters already set in game.php -> Please contact support staff");
    }
}
if(timedebug) $timelog.=microtime(true).": Loading Serverspecific konfiguration\n";
//looking for configuration files. 
if(!file_exists("conf/server/server-$config[Id].conf.php")){
    touch("conf/server/server-$config[Id].conf.php");
}
//loading defaults
require("conf/server/default.conf.php");
//loading server specific configuration
$defaultconfig=$config;
require("conf/server/server-$config[Id].conf.php");
$conf=array_replace_recursive($defaultconf,$config);



//####################################################################### Backup-Engine
if(timedebug) $timelog.=microtime(true).": checking Backupengine\n";
include("sc/backupengine.sc.php");




//####################################################################### Loading Player informations
if(timedebug) $timelog.=microtime(true).": Loading player informations\n";
$sql = "SELECT * FROM spieler WHERE Server='".intval($config[Id])."' AND User='".$_SESSION[user][Id]."'";
$db->query($sql);
if(!$spieler = $db->fetch_assoc()){
    show_error($error_msg[player_not_found]);
}

if($spieler[Ende]>date(U) OR $spieler[Ende]==0){
    //Spieler ist noch da
    $_SESSION[spieler]=$spieler;
    
    $spieler=$_SESSION[spieler];
    $_SESSION[spielerId] = $spieler["Id"];
    
    //_____________________________________________________ Forschung behandeln
    if($spieler[Fertig]<date(U) AND $spieler[Forsch]>0){
        $spieler[$config_bau[forsch][$spieler[Forsch]][db]]++;
        $spieler[Forsch]=0;
        $spieler[Fertig]=0;
    }
    //_____________________________________________________renew planetpoints
    if($spieler[Captcha_Last]%10==0){
        $db->query("SELECT SUM(punkte) as points FROM planet WHERE Spieler=$spieler[Id];");
        $spieler[Planetenpunkte]=$db->result(0,"points");
    }
    //_____________________________________________________ Calculate points
    $spieler[Gesamtpunkte]=$spieler[Flottenpunkte]+$spieler[Planetenpunkte];
    //_____________________________________________________ Berechnen der maximalen Einwohnerzahl
    $db->query("SELECT Sum(Geb_Wohnung) AS Wohnungen FROM planet WHERE Spieler='$spieler[Id]';");
    $spieler[BewohnerMax]=($db->result(0,"Wohnungen")+1)*$config[wohnungen];
    //_____________________________________________________ Zwischenzeit berechnen
    if(date(U)-$spieler[Last] < 300){
        $spieler[Playtime]=$spieler[Playtime]+(date(U)-$spieler[Last]);
    }
    //_____________________________________________________ Neue Zeit setzen
    $spieler[Last]=date(U);
    //Noop Protection runtersetzen
    if($spieler[ResetNoob]!=0 AND $spieler[ResetNoob]<date(U)){
    	$spieler[ResetNoob]=0;
    }
    //_____________________________________________________ noob protection
    if($spieler[Noobschutz]<$spieler[Gesamtpunkte]) $spieler[Noobschutz]=$spieler[Gesamtpunkte];
    //_____________________________________________________ Botschutz
    if($spieler[Captcha_Count]>0){
        $captcha_quote=$spieler[Captcha_Treffer]/$spieler[Captcha_Count];
    }else{
        $captcha_quote=1;
    }
    $config[captcha]=floor($config[captcha]*$captcha_quote);
    if($config[captcha]<10) $config[captcha]=10;
    //CaptchaCount setzten
    $spieler[Captcha_Last]++;
    if($spieler[Captcha_Last]>=$config[captcha] && $_POST['do']=="solve"){
        //Zeit berechnen
        $org=$_SESSION[captcha];//Um nicht so viel schreiben zu müssen^^
        if($_POST[x]>$org[x]-$org[s] AND $_POST[x]<$org[x]+$org[s] AND $_POST[y]>$org[y]-$org[s] AND $_POST[y]<$org[y]+$org[s]) {
            $time=date(U)-$_SESSION[captcha][starttime];
            $spieler[Captcha_Gestime]+=$time;
            if($time>$spieler[Captcha_Maxtime]) $spieler[Captcha_Maxtime]=$time;
            $spieler[Captcha_Treffer]++;
            $spieler[Captcha_Last]=0;
            $planet=$_SESSION[planet]; //dadurch werden x und y wieder überschrieben
            unset($_SESSION[captcha][starttime]);
        }
        $spieler[Captcha_Count]++;
    }
    
    //_____________________________________________________ Speichern der Änderungen
    $sql="";
    $blacklist = array(
    );
    foreach($spieler AS $key =>$value)
    {
    	if ($save_changes[$key] != true)
    	{
        	if($sql!="")
    		{
    			$sql=$sql.", ";
    		}
        	$sql=$sql."$key='".$db->real_escape_string($value)."'";
        }
    }
    $sql="UPDATE spieler SET $sql WHERE Id='$spieler[Id]'";
    $db->query($sql);
    
    $_SESSION[spieler]=$spieler;
    
    //####################################################################### Load planet
    if(timedebug) $timelog.=microtime(true).": Loading planetdata (other)\n";
    //handle planet change
    if(isset($_GET[planet])){
        $_SESSION[planet]=(int)$_GET[planet];
    }
    
    //Ist ein Planet gesetzt?
    if($_SESSION[planet]==0){
        //Es ist kein Planet selectiert, nimm einfach den ersten
        $sql = "SELECT Id FROM planet WHERE Spieler='$spieler[Id]' ORDER by Kolonisiert Limit 1";
    }else{
        //Es ist ein Planet selectiert, nimm doch den
        $sql = "SELECT Id FROM planet WHERE Spieler='$spieler[Id]' AND Id='$_SESSION[planet]' AND Typ != 'ally'";
    }
    $db->query($sql);
    if ($db->num_rows() == 0){ 
        // Es kann kein Planet gefunden werden, jetzt nimm irgendeinen
        $sql = "SELECT Id FROM planet WHERE Spieler='$spieler[Id]' AND Server='" . $_SESSION[server][Id] . "'";
        $db->query($sql);
    }
    $_SESSION[planet] = $db->result(0, "Id");

    //####################################################################### Alle Planeten aktualisieren, die ein Gebäude fertig haben BIS AUF den gewählten Planeten...
    $hauptplanet = $_SESSION[planet];
    $planet=$db->query("SELECT Id FROM planet WHERE Spieler='$spieler[Id]' AND Fertig<".date(U)." AND Id!=".$hauptplanet.";");
    if($db->num_rows($planet)>0){
        $changes=true;
        while($row=$db->fetch_assoc($planet)){
            loadplanet($row[Id]);
        }
    }
    
    //...Der kommt nämlich jetzt dran
    if(timedebug) $timelog.=microtime(true).": Loading actual planet\n";
    
    $planet=loadplanet($hauptplanet);
    
    // coordinates for galaxy view
    if(isset($_REQUEST[planet]) or isset($_REQUEST[server])){
        $_SESSION[x]=$planet[PosX];
        $_SESSION[y]=$planet[PosY];
    }
}//Ende laden der Spielerdaten wenn Runde nicht zuende




//####################################################################### Mixing language, content und design together
if($spieler[Ende]!=0 AND $spieler[Ende]<date(U)){
    switch ($_REQUEST[page]){
	    case "galaxy":
			$_SESSION[page]="galaxy";
		    $page="inc/game/game_galaxy.inc.php";
		break;
	    case "highscore":
			$_SESSION[page]="highscore";
		    $page="inc/game/game_highscore.inc.php";
		break;
	    default:
            $page="sc/verloren.sc.php";
    }
}elseif($spieler[Ban]>date(U)){
    $page="sc/ban.sc.php";
}elseif($spieler[Urlaub_Bis]>date(U)){
    $page="sc/umode.sc.php";
}elseif($spieler[Captcha_Last] >$config[captcha] AND $_REQUEST[acid]!=$_SESSION[acid]){
    $page="sc/botschutz.sc.php";
}else{
    if(isset($_REQUEST[page])){
    	$_SESSION[page]=$_REQUEST[page];  
	}
    
    if(file_exists("inc/game/game_$_SESSION[page].inc.php")){
    	$page="inc/game/game_".$_SESSION[page].".inc.php";
	}else{
		$_SESSION[page]="view";
    	$page="inc/game/game_view.inc.php";
	}
}




//load Languagepacks for specific page
if(timedebug) $timelog.=microtime(true).": Loading language packs\n";
$loclangfile="lang/".$_SESSION[lang]."/game_$_SESSION[page].lang.php";
if(file_exists($loclangfile)){
    include($loclangfile);
}

//change options
if(timedebug) $timelog.=microtime(true).": Setting options\n";
include("sc/options.sc.php");
//creating final website
if(timedebug) $timelog.=microtime(true).": Creating webpage\n";
$site=new website("templates/default/game.php");
$site->addcode("title","Sternen-Schlacht - $config[version]");
$site->addmodule("metatags",'sc/metatags.sc.php');
if($spieler[Ende]!=0 AND $spieler[Ende]<date(U)){
    $site->addcode("planetenwahl",'');
    $site->addcode("shortcuts",'');
    $site->addcode("ingamehelp",'');
}else{
    //Normal run
    $site->addmodule("planetenwahl",'module/game/planetenwahl.module.php');
    $site->addmodule("shortcuts",'module/game/shortcuts.module.php');
    $site->addmodule("ingamehelp",'module/game/ingamehelp.module.php');
}
$site->addmodule("menue",'module/game/menue.module.php');
$site->addmodule("footer",'module/game/footer.module.php');
$site->addcode("version","$config[version]");  //Workaround, da die Versionsnummer nicht includet werden kann-> gibt noch keine lösung für die globals

//load content
if(timedebug) $timelog.=microtime(true).": Generating content\n";
ob_start();
if($spieler[Ende]>date(U)) echo "<div class=\"info\">".$lang[final_countdown].showtime($spieler[Ende]-date(U))."</div>";
include($page);
if($_SESSION[user][Rang]>4) $site->addcode("content",ob_get_contents()."<br/><b>Timedebug:</b><br/><pre>$timelog</pre>");
else $site->addcode("content",ob_get_contents());
ob_clean();	
//display final page
if($spieler[Ende]!=0 AND $spieler[Ende]<date(U)){
    $site->addcode("tutorial",'');
    $site->addcode("ressleiste",$lang[ende_maininfo]);
    
}else{
    $site->addmodule("tutorial",'module/game/tutorial.module.php');
    $site->addmodule("ressleiste","module/game/ressleiste.module.php");
}
if(timedebug) $timelog.=microtime(true).": Display HTML-Code\n";
$site->show();

$db->showStat();
if(timedebug) $timelog.=microtime(true).": Job done and tired ;)\n";
if(timedebug) file_put_contents("tmp/timedebug.txt",$timelog);
